<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>LISTEN</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-insert.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-insert.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-load.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-load.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-LISTEN"></a>LISTEN</h1>
<div class="REFNAMEDIV"><a name="AEN52445"></a><h2>名称</h2>LISTEN&nbsp;--&nbsp;监听一个通知</div>
<a name="AEN52448"></a>
<div class="REFSYNOPSISDIV"><a name="AEN52450"></a><h2>语法</h2>
<pre class="SYNOPSIS">LISTEN <tt class="REPLACEABLE"><i>name</i></tt></pre>
</div>
<div class="REFSECT1"><a name="AEN52453"></a><h2>描述</h2>
<p><tt class="COMMAND">LISTEN</tt> 将当前会话注册为通知条件 <tt class="REPLACEABLE"><i>name</i></tt> 的监听器。如果当前会话已经被注册为该通知条件的监听器，那么什么也不做。</p>
<p>当执行了命令 <tt class="COMMAND">NOTIFY <tt class="REPLACEABLE"><i>name</i></tt></tt> 后，不管是此会话还是其它连接到同一数据库的会话，所有正在监听此通知条件的会话都将收到通知，并且接下来每个会话将通知与其相连的前端应用。请参考 <tt class="COMMAND">NOTIFY</tt> 获取更多信息。</p>
<p>使用 <tt class="COMMAND">UNLISTEN</tt> 命令可以将一个会话内已注册的通知条件删除。同样，会话退出时自动删除该会话正在监听的已注册通知条件。</p>
<p>前端应用检测通知事件的方法取决于 PostgreSQL 应用使用的编程接口。如果使用基本的 <span class="APPLICATION">libpq</span> 库，那么应用将 <tt class="COMMAND">LISTEN</tt> 当作普通 SQL 命令使用，而且必须周期地调用 <code class="FUNCTION">PQnotifies</code> 过程来检测是否有通知到达。其它像 <span class="APPLICATION">libpgtcl</span> 接口提供了更高级的控制通知事件的方法；实际上，使用 <span class="APPLICATION">libpgtcl</span> 的应用程序员不应该直接使用 <tt class="COMMAND">LISTEN</tt> 或 <tt class="COMMAND">UNLISTEN</tt> 。请参考你使用的接口的文档获取更多细节。</p>
<p><a href="sql-notify.html"><i>NOTIFY</i></a> 的手册页包含更广泛的关于 <tt class="COMMAND">LISTEN</tt> 和 <tt class="COMMAND">NOTIFY</tt> 的使用的讨论。</p>
</div>
<div class="REFSECT1"><a name="AEN52477"></a><h2>参数</h2>
<div class="VARIABLELIST">
<dl>
<dt><tt class="REPLACEABLE"><i>name</i></tt></dt>
<dd><p>通知条件的名字，可以是任意标识符。</p></dd>
</dl>
</div>
</div>
<div class="REFSECT1"><a name="AEN52485"></a><h2>例子</h2>
<p>在 <span class="APPLICATION">psql</span> 里配制和执行一个监听/通知序列：</p>
<pre class="PROGRAMLISTING">LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.</pre>
</div>
<div class="REFSECT1"><a name="AEN52490"></a><h2>兼容性</h2>
<p>SQL 标准里没有 <tt class="COMMAND">LISTEN</tt> 语句。</p>
</div>
<div class="REFSECT1"><a name="AEN52494"></a><h2>又见</h2><a href="sql-notify.html"><i>NOTIFY</i></a>, <a href="sql-unlisten.html"><i>UNLISTEN</i></a></div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-insert.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-load.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">INSERT</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">LOAD</td></tr>
</table>
</div>
</body></html>